package org.example.spring_frist.learn;

import jakarta.servlet.http.HttpServletResponse;
import lombok.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

/**
 * 因为当@RestController这个标签修饰类表示这个类中的方法放回的是数据
 * 而@Controller标签修饰类表示的是这个类中的方法返回的是页面
 * 而@RestController这个标签的作用是@Controller+@ResponseBody这俩个标签相加
 * 所以如果一个类中又要返回页面又要返回数据的话可以使用@Controller这标签修饰类，在将要返回数据的方法使用@ResponseBody修饰
 * Controller：定义一个加载器，当spring加载时启动，把对象交给spring处理
 * ResponseBody：定义对象返回的数据格式为非页面，他是类注解也是方法注解，当定义类是表示所有方法返回的都是数据
 */
//@RestController 使用这个标签不能返回html页面
@Controller
@RequestMapping("/hello2")
public class hello2 {
    //返回静态页面 html
    @RequestMapping("r1")
    public String r1() {
        return "/h1.html";
    }

    //返回数据
    @ResponseBody
    @RequestMapping("r2")
    public String r2() {
        return "/html2.html";
    }

    //返回数据当时数据是http片段，也会被浏览器给解析
    @ResponseBody
    @RequestMapping("r3")
    public String r3() {
        return "<h1>hello r3</h1>";
    }

    //状态码并不会影响页面的返回
    @RequestMapping("r4")
    public String r4(HttpServletResponse response) {
        response.setStatus(404);
        return "/h1.html";
    }

    /**
     * Content-type的取值
     * text/plain 返回存文本的数据
     * text/html body格式是html
     * text/css  body格式是css
     * application/javaSprint body格式是javaSprint
     * application/json  body格式是json
     */

    //json的返回 类的返回
    @ResponseBody
    @RequestMapping("r5")
    public classInfo r5() {
        return new classInfo();
    }

    /**
     * 设置返回的类型，这些都在RequestMapping中设置
     * name 标识该映射，参与url的生成
     * value 指定映射的url，是path的别名 path= "/xx"
     * path  指定映射的url path= "/xx"
     * method  设置请求的类型 post 还是get这种
     * params  细化url请求的映射，可以通过该该字段设置请求需要满足哪些条件才能使用这个映射
     * params = {"value","value != 111","!value1"}表示请求需要包含value且值不为111且没有value1这个参数这个参数才能调用，
     * headers  指定请求头中需要包含某些参数，请求才会被处理
     * consumes  指定请求的Content—type的类型
     * produce  设置返回的请求的Content—type的类型
     */
    @ResponseBody
    @RequestMapping(name = "R6", path = "r6", produces = "application/json")
    public String r6() {
        return "{\"json\":right}";
    }


    @ResponseBody
    @RequestMapping(value = "r7", produces = "text/html")
    public String r7() {
        return "eee";
    }

    @ResponseBody
    @RequestMapping(path = "r8", produces = "text/plain")
    public String r8() {
        return "hello complaint text";
    }

    //请求是application/json类型切要包含values参数，返回的响应的类型是text/html
    //使用@RequestParam来特别表示这个values参数，@RequestBody来接受请求的json
    @ResponseBody
    @RequestMapping(path = "r9", params = {"values"}, produces = "text/html",
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public String r9(@RequestParam String values,
                     @RequestBody Object b) {

        return "text " + values +" " + b.toString();
    }

    @Getter
    @Setter
    @ToString
    @AllArgsConstructor
    @NoArgsConstructor
    public static class classInfo {
        private String name;
        private String superclass;
        private String age;
    }
}

